package JVM.第02篇_类的加载篇;

/**
 * 类加载机制的必要性
 * 一般情况下， Java开发 人员并不需要在程序中显式地使用类加载器，
 * 但是了解类加载器的加载机制却显得至关重要。
 * 从以下几个方面说:
 * ●避免在开发中遇到java.lang.ClassNotFoundException异常或
 * java.lang.NoClassDefFoundError异常时，手足无措。
 * 只有了解类加载器的加载机制才能够在出现异常的时候快速地根据错误异常日志定位问题和解决问题
 * ●需要支持类的动态加载或需要对编译后的字节码文件进行加解密操作时，
 * 就需要与类加载器打交道了。
 * ●开发人员可以在程序中编写自定义类加载器来重新定义类的加载规则，
 * 以便实现一些自定义的处理逻辑。
 *
 * 1.何为类的唯一性?
 * 对于任意一个类，都需要由加载它的类加载器和这个类本身一同确认其在Java虚拟机中的唯一性。
 * 每一个类加载器，都拥有一个独立的类名称空间:
 *      比较两个类是否相等，只有在这两个类是由同一个类加载器加载的前提下才有意义。
 *      否则，即使这两个类源自同一个Class文件，被同一个虚拟机加载，
 *          只要加载他们的类加载器不同，那这两个类就必定不相等。
 * 2.命名空间
 *      ●每个类加载器都有自己的命名空间，命名空间由该加载器及所有的父加载器所加载的类组成
 *      ●在同一命名空间中，不会出现类的完整名字(包括类的包名)相同的两个类
 *      ●在不同的命名空间中，有可能会出现类的完整名字(包括类的包名)相同的两个类
 *
 * 在大型应用中，我们往往借助这一特性， 来运行同一个类的不同版本。
 *
 *
 * 通常类加载机制有三个基本特征:
 *   ●双亲委派模型。但不是所有类加载都遵守这个模型，有的时候，
 *    启动类加载器所加载的类型，是可能要加载用户代码的，
 *    比如JDK内部的ServiceProvider/ServiceLoader机制用户可以在标准API框架上，
 *    提供自己的实现，JDK 也需要提供些默认的参考实现。
 *    例如Java中JNDI、 JDBC、文件系统、Cipher等很多方面，都是利用的这种机制，这种情况
 *    就不会用双亲委派模型去加载，而是利用所谓的上下文加载器。
 *   ●可见性。子类加载器可以访问父加载器加载的类型，但是反过来是不允许的。
 *    不然，因为缺少必要的隔离，我们就没有办法利用类加载器去实现容器的逻辑。
 *   ●单一性。由于父加载器的类型对于子加载器是可见的，所以父加载器中加载过的类型，
 *    就不会在子加载器中重复加载。但是注意，类加载器“邻居”间，
 *    同 一类型仍然可以被加载多次，因为互相并不可见。
 *
 */
public class B0_类装载器 {

}
